﻿using Litografia.BusinessEntities;
using Litografia.DataObjects;
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Nortec.Security;

namespace Litografia.Tests.DataObjects
{
    [TestClass]
    public class DORegistroOTTest
    {
        #region Additional test attributes
        //
        // You can use the following additional attributes as you write your tests:
        //
        // Use ClassInitialize to run code before running the first test in the class
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // Use ClassCleanup to run code after all tests in a class have run
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // Use TestInitialize to run code before running each test 
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // Use TestCleanup to run code after each test has run
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        #region Declarations

        private static Database db;

        #endregion

        [TestMethod]
        public void GetWithValidOTNumber()
        {
            var otNumber = GetAnyOTNumber();
            var ot = DOOT.Get(otNumber);

            var expectedOT = new BEOT();
            var expectedOTColumns = expectedOT.OrdenTrabajo.Columns.Count;
            var expectedOTEntregaColumns = expectedOT.OTEntrega.Columns.Count;
            var expectedOTDetalleColumns = expectedOT.OTDetalle.Columns.Count;
            var expectedOTGastoColumns = expectedOT.OTGasto.Columns.Count;
            var expectedOTMaterialColumns = expectedOT.OTMaterial.Columns.Count;
            
            Assert.IsNotNull(ot);
            Assert.AreEqual(otNumber, ot.OrdenTrabajo[0].NumeroOT);
            Assert.AreEqual(expectedOTColumns, ot.OrdenTrabajo.Columns.Count);
            Assert.AreEqual(expectedOTEntregaColumns, ot.OTEntrega.Columns.Count);
            Assert.AreEqual(expectedOTDetalleColumns, ot.OTDetalle.Columns.Count);
            Assert.AreEqual(expectedOTGastoColumns, ot.OTGasto.Columns.Count);
            Assert.AreEqual(expectedOTMaterialColumns, ot.OTMaterial.Columns.Count);
        }

        [TestMethod]
        public void SaveOTUpdateValidInput()
        {
            var otNumber = GetAnyOTNumber();
            var ot = DOOT.Get(otNumber);
            NortecMembership.CompanyId = ot.OrdenTrabajo[0].EmpresaId;

            var originalCantidad = ot.OrdenTrabajo[0].Cantidad;
            var originalLaser = ot.OrdenTrabajo[0].Laser;
            var originalFechaInicial = ot.OrdenTrabajo[0].FechaInicial;

            var expectedCantidad = ot.OrdenTrabajo[0].Cantidad + 1;
            var expectedLaser = !ot.OrdenTrabajo[0].Laser;
            var expectedFechaInicial = ot.OrdenTrabajo[0].FechaInicial.AddDays(1);

            ot.OrdenTrabajo[0].Cantidad = expectedCantidad;
            ot.OrdenTrabajo[0].Laser = expectedLaser;
            ot.OrdenTrabajo[0].FechaInicial = expectedFechaInicial;
            DOOT.Save(ot);
            ot = DOOT.Get(otNumber);

            // Prueba la actualizacion
            Assert.IsNotNull(ot);
            Assert.AreEqual(expectedCantidad, ot.OrdenTrabajo[0].Cantidad);
            Assert.AreEqual(expectedLaser, ot.OrdenTrabajo[0].Laser);
            Assert.AreEqual(expectedFechaInicial, ot.OrdenTrabajo[0].FechaInicial);
            
            // Restaura el estado inicial de la OT
            ot.OrdenTrabajo[0].Cantidad = originalCantidad;
            ot.OrdenTrabajo[0].Laser = originalLaser;
            ot.OrdenTrabajo[0].FechaInicial = originalFechaInicial;
            DOOT.Save(ot);
        }
        
        #region Helpers
        
        private static string GetAnyOTNumber()
        {
            var sql = "select top 1 numeroOT from Lit_ot";
            var id = (string)DB.ExecuteScalar(System.Data.CommandType.Text, sql);
            return id;
        }

        protected static Database DB
        {
            get
            {
                if (db == null)
                    db = DatabaseFactory.CreateDatabase();
                return db;
            }
        }

        #endregion
    }
}